script memo

#!/bin/sh

` `
代入は ` ` で囲むと、囲まれた部分の実行結果を代入してくれる。
    mS=`echo "scale=9; 0.37452" | bc -l`
    
optionの詳細は忘れた。

" " と ' ' の違い
例で理解してください。
    x=1
    dam1="data$1.dat"
    dam2='data$1.dat'
    echo $dam1 $dam2
    
こうすると実行結果が、
    data1.dat data$1.dat
    
となる。ファイル名をループ内で次々と変えたいなら " " を使うとよい。

0.235e-02 等を認識してくれないので、数字に直す方法。
awk を使う。1.0倍するところがポイント。
    mS=`(echo 0.235e-02 | awk '{print $1*1.0}')`
    

x^y を計算するときのトリック
bash では x^yを計算してくれない。以前スクリプトに書いてあったメモを貼っておく。
     10^(0.1*numL) をすると、couplingをlog プロットするのに
     都合のいい間隔で進む。
     ベキは整数しか駄目なのでわざわざ次を使う: x^y = exp(y*Log(x) )
     10^(x) = e(x*l(10))
    
     example: 10^($numDM/50) とするときのトリック
     DMmass=`echo "scale=9; e(($numDM / 50 )*l(10)) " | bc -l`
    

足し算
次のように、$(( )) で囲むか、expr を使う。(bc を使う方法もあるはずだが忘れた。)
    x=3;
    y=4;
    hoge=$(($x+$y))
    hoge2=$((3+4))
    hoge3=`expr $x + $y`
    
ループ
    ある変数XXXを、minXXX < XXX < maxXXX の範囲で、stepXXXずつ大きくしながら計算したいとする。 C言語なら、
      for(XXX=minXXX; maxXXX; XXX=XXX+stepXXX)
    だが、bashではそうはいかない。以下のようにする。
    (この例は、Mass=1000, 2000, 3000, ..., 20000)
      # minXXX  : minimal value of XXX
      # maxXXX  : maxmum value of XXX
      # stepXXX : 1回のfor loopで XXX をいくつ増やすか 
      # numXXX  : for loop の初期値
      # maxnumXXX : for loop の最後の値 + 1
      
      minMass=`echo "scale=9; 1000" | bc -l`
      maxMass=`echo "scale=9; 20000" | bc -l`
      step=1000
      num=0
      maxnum=`echo "scale=0; ($maxMass - $minMass)/$step + 1" | bc`
      
      while [ $num -lt $maxnum ]
      do
          Mass=`echo "scale=9; $minMass + $step * $num" | bc -l`
      
        (やりたいことを書く)
          
          num=`expr $num + 1`
      done
      
Tips
  • hogehoge

  • give up!